/*
 * Copyright (c) 2013, SRI International
 * All rights reserved.
 * Licensed under the The BSD 3-Clause License;
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 * 
 * http://opensource.org/licenses/BSD-3-Clause
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 
 * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 * 
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * 
 * Neither the name of the aic-web-praise nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package com.sri.ai.lpitools.latex.server;

import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CharStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.TokenStream;


import org.antlr.runtime.tree.CommonTreeNodeStream;

import com.sri.ai.lpitools.latex.server.EquationGrammarParser.converter_return;

public class LatexTranslator {
	private EquationGrammarLexer lexer;
	private EquationGrammarParser parser;
	private EquationWalker walker;
	private NewEquationWalker walkerNew;
	/**
	 * Takes in unformatted expressions and converts them to LaTeX for formatting. 
	 * @param input The expression to be converted.
	 * @return A LaTeX string representing the expression.
	 * @throws RecognitionException Something went wrong with the antlr parsing.
	 * @throws IllegalArgumentException The input was not of the correct format.
	 */
	public String translateJLatexMath(String input) throws RecognitionException, IllegalArgumentException
	{
		//Convert input to antlr stream.
		CharStream stream = new ANTLRStringStream(input);
		//Create Lexer on input.
		lexer = new EquationGrammarLexer(stream);
		//Get token stream from Lexer.
		TokenStream tokenStream = new CommonTokenStream(lexer);
		//Create parser on tokens.
		parser = new EquationGrammarParser(tokenStream);
		//Get Abstract Syntax Tree of input.
		converter_return converter = parser.converter();
		//Create a nodeStream of the tree for the walker.
		CommonTreeNodeStream nodeStream = new CommonTreeNodeStream(converter.tree);
		//Create a walker on the nodeStream.
		walker = new EquationWalker(nodeStream);
		//Get the result of the walk.
		String result = walker.converter();
		//If input did not belong to grammar, throw an exception.
		if(result.equalsIgnoreCase("invalid"))
		{
			throw new IllegalArgumentException("Not a valid input string.");
		}

		return result;
	}

	
	/**
	 * Takes in unformatted expressions and converts them to LaTeX for formatting. 
	 * @param input The expression to be converted.
	 * @return A LaTeX string representing the expression.
	 * @throws RecognitionException Something went wrong with the antlr parsing.
	 * @throws IllegalArgumentException The input was not of the correct format.
	 */
	public String translateTexLive(String input) throws RecognitionException, IllegalArgumentException
	{
		//Convert input to antlr stream.
		CharStream stream = new ANTLRStringStream(input);
		//Create Lexer on input.
		lexer = new EquationGrammarLexer(stream);
		//Get token stream from Lexer.
		TokenStream tokenStream = new CommonTokenStream(lexer);
		//Create parser on tokens.
		parser = new EquationGrammarParser(tokenStream);
		//Get Abstract Syntax Tree of input.
		converter_return converter = parser.converter();
		//Create a nodeStream of the tree for the math filter walker.
		CommonTreeNodeStream nodeStream = new CommonTreeNodeStream(converter.tree);
		//parse with the mathfilter walker
		MathFilterWalker p = new MathFilterWalker(nodeStream);
		
		com.sri.ai.lpitools.latex.server.MathFilterWalker.converter_return converter2 = p.converter();
		nodeStream = new CommonTreeNodeStream(converter2.tree);
		//Create a walker on the nodeStream.
		walkerNew = new NewEquationWalker(nodeStream);
		//Get the result of the walk.
		String result = walkerNew.converter();
		//If input did not belong to grammar, throw an exception.
		if(result.equalsIgnoreCase("invalid"))
		{
			throw new IllegalArgumentException("Not a valid input string.");
		}
		
		return result;
	}
	
}
